package com.bosssoft.trainee.nontax.utils;/*
菜单树
@author shencanting
@date 2022/06/192140
**/

import com.bosssoft.trainee.nontax.entity.po.PermissionPO;
import com.bosssoft.trainee.nontax.entity.vo.RouterVO;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @author shencanting
 */
public class MenuTree {

    private MenuTree(){}
    /**
     * 生成路由
     * @param meuList 菜单列表
     * @param pid 父级菜单
     */
    public static List<RouterVO> makeRouter(List<PermissionPO> meuList, Long pid){
        //创建集合保存路由列表
        List<RouterVO> routerList = new ArrayList<>();
        //如果menuList菜单列表不为空，则使用菜单列表，否则创建集合对象
        Optional.ofNullable(meuList).orElse(new ArrayList<>())
                .stream().filter(item -> item != null && item.getParentId().equals(pid))
                .forEach(item -> {
                    //创建路由对象
                    RouterVO router = new RouterVO();
                    router.setName(item.getName());//路由名称
                    router.setPath(item.getPath());//路由地址
                    //判断是否是一级菜单
                    if (item.getParentId() == 0L) {
                        router.setComponent("Layout");//一级菜单组件
                        router.setAlwaysShow(true);//显示路由
                    }else{
                        router.setComponent(item.getUrl());//具体的组件
                        router.setAlwaysShow(false);//折叠路由
                    }
                    //设置meta信息
                    router.setMeta(router.new Meta(item.getLabel(),
                            item.getIcon(),item.getCode().split(",")));
                    //递归生成路由
                    List<RouterVO> children = makeRouter(meuList, item.getId());
                    router.setChildren(children);//设置子路由到路由对象中
                    //将路由信息添加到集合中
                    routerList.add(router);
                });
        return routerList;
    }

    /**
     * 生成菜单树
     * @param meuList
     * @param pid
     * @return
     */
    public static List<PermissionPO> makeMenuTree(List<PermissionPO> meuList, Long pid){
        //创建集合保存菜单
        List<PermissionPO> permissionPOList = new ArrayList<>();
        //如果menuList菜单列表不为空，则使用菜单列表，否则创建集合对象
        Optional.ofNullable(meuList).orElse(new ArrayList<>())
                .stream().filter(item -> item != null && Objects.equals(item.getParentId(), pid))
                .forEach(item -> {
                        //创建菜单权限对象
                        PermissionPO permissionPO = new PermissionPO();
                        //复制属性
                        BeanUtils.copyProperties(item, permissionPO);
                        //获取每一个item的下级菜单,递归生成菜单树
                        List<PermissionPO> children = makeMenuTree(meuList, item.getId());
                        //设置子菜单
                        permissionPO.setChildren(children);
                        //将菜单对象添加到集合
                        permissionPOList.add(permissionPO);
        });
    return permissionPOList;
    }
}
